[powerpc] domain building fixes for linux kexec model
authorJimi Xenidis <jimix@watson.ibm.com>
Wed, 26 Jul 2006 18:24:09 +0000 (14:24 -0400)
committerJimi Xenidis <jimix@watson.ibm.com>
Wed, 26 Jul 2006 18:24:09 +0000 (14:24 -0400)
The following updates are included:
  - No stack allocation is necessary
  - Some buggy kernels require r13 to be zeroed
  - the DTB must be loaded from a fixed address, we are using
    "/root/DomU.dtb" until we have the tools build the DTB on their
    own.
  - Though we give the PFN of the store and console pages to the new
    domain we must make sure the MFN is given to the tools.

Signed-off-by: Jimi Xenidis <jimix@watson.ibm.com>
tools/libxc/xc_ppc_linux_build.c

index 7230867fccd7686b72a5f3f5a585263460998a9a..884f6dab5cfcabd1e65c001a7f0652dabd658028 100644 (file)
@@ -106,10 +106,13 @@ static int init_boot_vcpu(
     memset(&ctxt.user_regs, 0x55, sizeof(ctxt.user_regs));
     ctxt.user_regs.pc = dsi->v_kernentry;
     ctxt.user_regs.msr = 0;
-    ctxt.user_regs.gprs[1] = 32<<20; /* XXX arbitrary stack address */
+    ctxt.user_regs.gprs[1] = 0; /* Linux uses its own stack */
     ctxt.user_regs.gprs[3] = dtb;
     ctxt.user_regs.gprs[4] = kaddr;
     ctxt.user_regs.gprs[5] = 0;
+    /* There is a buggy kernel that does not zero the "local_paca", so
+     * we must make sure this register is 0 */
+    ctxt.user_regs.gprs[13] = 0;
 
     VERBOSE(printf("xc_vcpu_setvcpucontext:\n"
                  "  pc 0x%"PRIx64", msr 0x016%"PRIx64"\n"
@@ -343,6 +346,8 @@ static int get_page_array(int xc_handle, int domid, xen_pfn_t **page_array)
     return 0;
 }
 
+
+
 int xc_linux_build(int xc_handle,
                    uint32_t domid,
                    const char *image_name,
@@ -385,13 +390,14 @@ int xc_linux_build(int xc_handle,
     /* XXX install initrd addr/len into device tree */
 
     dtb_addr = (16 << 20);
-    if (load_dtb(xc_handle, domid, "DomU.dtb", dtb_addr, &dsi, page_array)) {
+    if (load_dtb(xc_handle, domid, "/root/DomU.dtb", dtb_addr, &dsi, page_array)) {
         dtb_addr = 0;
     }
 
     si_addr = create_start_info(&si, store_evtchn, console_evtchn);
-    *console_mfn = si.console_mfn;
-    *store_mfn = si.store_mfn;
+    *console_mfn = page_array[si.console_mfn];
+    *store_mfn = page_array[si.store_mfn];
+    
     if (install_image(xc_handle, domid, page_array, &si, si_addr,
                 sizeof(start_info_t))) {
         rc = -1;